package com.mycompany.myapp.dao.spring;

import com.mycompany.myapp.dao.JoueurDao;
import com.mycompany.myapp.dto.Joueur;
import com.mycompany.myapp.dto.JoueurPk;
import com.mycompany.myapp.exceptions.JoueurDaoException;
import java.util.List;
import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.simple.SimpleJdbcTemplate;
import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
import org.springframework.transaction.annotation.Transactional;

public class JoueurDaoImpl extends AbstractDAO implements ParameterizedRowMapper<Joueur>, JoueurDao
{
	protected SimpleJdbcTemplate jdbcTemplate;

	protected DataSource dataSource;

	/**
	 * Method 'setDataSource'
	 * 
	 * @param dataSource
	 */
	public void setDataSource(DataSource dataSource)
	{
		this.dataSource = dataSource;
		jdbcTemplate = new SimpleJdbcTemplate(dataSource);
	}

	/**
	 * Method 'insert'
	 * 
	 * @param dto
	 * @return JoueurPk
	 */
	@Transactional
	public JoueurPk insert(Joueur dto)
	{
		jdbcTemplate.update("INSERT INTO " + getTableName() + " ( motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ ) VALUES ( ?, ?, ?, ?, ? )",dto.getMotDePasse(),dto.getLogin(),dto.isVieActuelleJNull()?null:dto.getVieActuelleJ(),dto.isVieMaxJNull()?null:dto.getVieMaxJ(),dto.isLieuActuelJNull()?null:dto.getLieuActuelJ());
		JoueurPk pk = new JoueurPk();
		pk.setIdJoueur( jdbcTemplate.queryForInt("select last_insert_id()") );
		return pk;
	}

	/** 
	 * Updates a single row in the joueur table.
	 */
	@Transactional
	public void update(JoueurPk pk, Joueur dto) throws JoueurDaoException
	{
		jdbcTemplate.update("UPDATE " + getTableName() + " SET idJoueur = ?, motDePasse = ?, login = ?, vieActuelleJ = ?, vieMaxJ = ?, lieuActuelJ = ? WHERE idJoueur = ?",dto.getIdJoueur(),dto.getMotDePasse(),dto.getLogin(),dto.getVieActuelleJ(),dto.getVieMaxJ(),dto.getLieuActuelJ(),pk.getIdJoueur());
	}

	/** 
	 * Deletes a single row in the joueur table.
	 */
	@Transactional
	public void delete(JoueurPk pk) throws JoueurDaoException
	{
		jdbcTemplate.update("DELETE FROM " + getTableName() + " WHERE idJoueur = ?",pk.getIdJoueur());
	}

	/**
	 * Method 'mapRow'
	 * 
	 * @param rs
	 * @param row
	 * @throws SQLException
	 * @return Joueur
	 */
	public Joueur mapRow(ResultSet rs, int row) throws SQLException
	{
		Joueur dto = new Joueur();
		dto.setIdJoueur( rs.getInt( 1 ) );
		dto.setMotDePasse( rs.getString( 2 ) );
		dto.setLogin( rs.getString( 3 ) );
		dto.setVieActuelleJ( rs.getInt( 4 ) );
		if (rs.wasNull()) {
			dto.setVieActuelleJNull( true );
		}
		
		dto.setVieMaxJ( rs.getInt( 5 ) );
		if (rs.wasNull()) {
			dto.setVieMaxJNull( true );
		}
		
		dto.setLieuActuelJ( rs.getInt( 6 ) );
		if (rs.wasNull()) {
			dto.setLieuActuelJNull( true );
		}
		
		return dto;
	}

	/**
	 * Method 'getTableName'
	 * 
	 * @return String
	 */
	public String getTableName()
	{
		return "projetrmi.joueur";
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'idJoueur = :idJoueur'.
	 */
	@Transactional
	public Joueur findByPrimaryKey(int idJoueur) throws JoueurDaoException
	{
		try {
			List<Joueur> list = jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE idJoueur = ?", this,idJoueur);
			return list.size() == 0 ? null : list.get(0);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria ''.
	 */
	@Transactional
	public List<Joueur> findAll() throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " ORDER BY idJoueur", this);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'idJoueur = :idJoueur'.
	 */
	@Transactional
	public List<Joueur> findWhereIdJoueurEquals(int idJoueur) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE idJoueur = ? ORDER BY idJoueur", this,idJoueur);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'motDePasse = :motDePasse'.
	 */
	@Transactional
	public List<Joueur> findWhereMotDePasseEquals(String motDePasse) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE motDePasse = ? ORDER BY motDePasse", this,motDePasse);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'login = :login'.
	 */
	@Transactional
	public List<Joueur> findWhereLoginEquals(String login) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE login = ? ORDER BY login", this,login);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'vieActuelleJ = :vieActuelleJ'.
	 */
	@Transactional
	public List<Joueur> findWhereVieActuelleJEquals(int vieActuelleJ) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE vieActuelleJ = ? ORDER BY vieActuelleJ", this,vieActuelleJ);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'vieMaxJ = :vieMaxJ'.
	 */
	@Transactional
	public List<Joueur> findWhereVieMaxJEquals(int vieMaxJ) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE vieMaxJ = ? ORDER BY vieMaxJ", this,vieMaxJ);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns all rows from the joueur table that match the criteria 'lieuActuelJ = :lieuActuelJ'.
	 */
	@Transactional
	public List<Joueur> findWhereLieuActuelJEquals(int lieuActuelJ) throws JoueurDaoException
	{
		try {
			return jdbcTemplate.query("SELECT idJoueur, motDePasse, login, vieActuelleJ, vieMaxJ, lieuActuelJ FROM " + getTableName() + " WHERE lieuActuelJ = ? ORDER BY lieuActuelJ", this,lieuActuelJ);
		}
		catch (Exception e) {
			throw new JoueurDaoException("Query failed", e);
		}
		
	}

	/** 
	 * Returns the rows from the joueur table that matches the specified primary-key value.
	 */
	public Joueur findByPrimaryKey(JoueurPk pk) throws JoueurDaoException
	{
		return findByPrimaryKey( pk.getIdJoueur() );
	}

}
